package com.excilys.formation.project.entities;

import java.util.Set;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.validation.constraints.NotNull;

import org.hibernate.annotations.Index;
import org.hibernate.annotations.Type;
import org.hibernate.validator.constraints.Length;
import org.hibernate.validator.constraints.NotEmpty;
import org.joda.time.DateTime;

/**
 * 
 * @author excilys
 * 
 */
@Entity
public class Transaction implements Comparable<Transaction> {
	/**
	 * Taille maximale du libellé.
	 */
	private static final int MAX_LIBELLE_SIZE = 255;
	/**
	 * Indentifiant de la transation.
	 */
	private long id;

	/**
	 * setTransaction Ensembles des opérations associées à la transaction.
	 */
	private Set<Operation> operations;

	/**
	 * Libellé de la transaction.
	 */
	private String libelle;

	/**
	 * Date de la transaction, par défaut, l'instant présent.
	 */
	private DateTime date = DateTime.now();

	/**
	 * Date d'effet la transaction, par défaut, l'instant présent.
	 */
	private DateTime dateEffet = DateTime.now();

	/**
	 * @return Indentifiant de la transation.
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	public long getId() {
		return id;
	}

	/**
	 * @param id
	 *            le nouvel indentifiant de la transation.
	 */
	public void setId(long id) {
		this.id = id;
	}

	/**
	 * 
	 * @return l'ensemble des opérations associées à la transaction.
	 */
	@OneToMany(mappedBy = "transaction")
	public Set<Operation> getOperations() {
		return operations;
	}

	/**
	 * @param operations
	 *            les nouvelles opérations liées à la transaction.
	 */
	public void setOperations(Set<Operation> operations) {
		this.operations = operations;
	}

	/**
	 * Renvoie le libellé de la transaction.
	 * 
	 * @return le libellé de la transaction
	 */
	@NotEmpty
	@Length(max = MAX_LIBELLE_SIZE)
	public String getLibelle() {
		return libelle;
	}

	/**
	 * Change le libellé de la transaction.
	 * 
	 * @param libelle
	 *            le nouveau libellé de la transaction.
	 */
	public void setLibelle(String libelle) {
		this.libelle = libelle;
	}

	/**
	 * @return la date de création de la transaction
	 */
	@Index(name = "date")
	@NotNull
	@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
	public DateTime getDate() {
		return date;
	}

	/**
	 * Modifie la date de création de la transaction.
	 * 
	 * @param date
	 *            la date de création de la transaction.
	 */
	public void setDate(DateTime date) {
		this.date = date;
	}

	/**
	 * @return la date d'effet de la transaction
	 */
	@Index(name = "date_effet")
	@NotNull
	@Type(type = "org.jadira.usertype.dateandtime.joda.PersistentDateTime")
	public DateTime getDateEffet() {
		return dateEffet;
	}

	/**
	 * @param dateEffet
	 *            la nouvelle date d'effet de la transaction.
	 */
	public void setDateEffet(DateTime dateEffet) {
		this.dateEffet = dateEffet;
	}

	@Override
	public int compareTo(Transaction o) {
		return date.compareTo(o.date);
	}

}
